home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1999 March / EnigmA AMIGA RUN 35 (1999)(G.R. Edizioni)(IT)[!][issue 1999-03].iso / earcd / -archivi / -recent2 / gaplib.lha / GAPLib_Beta / genomes / RealMatrix.c < prev   
C/C++ Source or Header  |  1998-11-25  |  2KB  |  105 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <GAP.h>
  4.  
  5. /*
  6.  * Example real-matrix genome and functions for Crossover, Mutation,
  7.  * Comparing, Initizlization and Displaying.
  8.  *
  9.  */
  10.  
  11. #define    WIDTH        8
  12. #define    HEIGHT    8
  13.  
  14. struct    RMPolyphant {
  15.     double    matrix[HEIGHT][WIDTH];
  16.     int    x,y;
  17. };
  18.  
  19. void RMInit(struct RMPolyphant * );
  20. void RMMutate(struct RMPolyphant * );
  21. void RMCross(struct RMPolyphant * , struct RMPolyphant *);
  22. void RMDisplay(struct RMPolyphant * );
  23. double RMDist(struct RMPolyphant *,struct RMPolyphant *);
  24.  
  25. void RMInit(struct RMPolyphant *Polly) 
  26. {
  27. int x,y;
  28.  
  29. Polly->x = WIDTH;
  30. Polly->y = HEIGHT;
  31.  
  32. for(x=0;x!=WIDTH;x++) {
  33.     for(y=0;y!=HEIGHT;y++) {
  34.         Polly->matrix[y][x] = Rnd(0x7ffffffe)/(double)Rnd(0x7ffffffe);
  35.         if(Rnd(16)<8) {
  36.             Polly->matrix[y][x] = -Polly->matrix[y][x];
  37.         }
  38.     }
  39. }
  40.     
  41. }
  42.  
  43. void RMMutate(struct RMPolyphant *Polly)
  44. {
  45. int fx,fy;
  46.  
  47. fx = Rnd(Polly->x);
  48. fy = Rnd(Polly->y);
  49.  
  50. Polly->matrix[fy][fx] = Rnd(0x7ffffffe)/(double)Rnd(0x7ffffffe);
  51. if(Rnd(16)<8) {
  52.     Polly->matrix[fy][fx] = -Polly->matrix[y][x];
  53. }
  54.  
  55. }
  56.  
  57. void RMCross(struct RMPolyphant *Polly,struct RMPolyphant *Tweety)
  58. {
  59. int x,y,px,py;
  60. double    t;
  61.  
  62. px = Rnd(Polly->x);
  63. py = Rnd(Polly->y);
  64.  
  65. for(x=0;x!=Polly->x;x++) {
  66.     for(y=0;y!=Polly->y;y++) {
  67.         if((x<px && y<py) || (x>=px && y>=py)) {
  68.             t = Polly->matrix[y][x];
  69.             Polly->matrix[y][x] = Tweety->matrix[y][x];
  70.             Tweety->matrix[y][x] = t;
  71.         }
  72.     }
  73. }
  74.  
  75. }
  76.  
  77. void RMDisplay(struct RMPolyphant *Polly)
  78. {
  79. int x,y;
  80.  
  81. for(y=0;y!=Polly->y;y++) {
  82.     printf("#");
  83.     for(x=0;x!=Polly->x;x++) {
  84.         printf("%+ 7.2lf #",Polly->matrix[y][x]);
  85.     }
  86.     printf("\n");
  87. }
  88.  
  89. }
  90.  
  91. double RMDist(struct RMPolyphant *Polly,struct RMPolyphant *Tweety)
  92. {
  93. double sum=0.0,temp;
  94. int x,y;
  95.  
  96. for(x=0;x!=WIDTH;x++) {
  97.     for(y=0;y!=HEIGHT;y++) {
  98.         temp = (Polly->matrix[y][x]-Tweety->matrix[y][x]);
  99.         sum += temp*temp;
  100.     }
  101. }
  102.  
  103. return(sqrt(sum));
  104. }
  105.